//=============================================
var a = []
for (var i = 0; i < 10; i++) {
    a[i] = function () {
        console.log(i)
    }
}
a[6]()

/****
 * i在for循环中声明为全局变量
 * 当for循环执行完成此时的i为10
 * 因此a[6]执行log打印i的结果为10
 *
 */

//=============================================
var tmp = 123;
if (true) {
    console.log(tmp)
    let tmp
}
/***
 * let 定义变量未声明前有暂时性死区
 * 因此打印报错
 *
 * */


//=============================================
var arr = [12, 34, 32, 89, 4]
console.log(Math.min(...arr))

//=============================================
// let var const 三种声明变量的方式之间的具体差别
/**
 * var 定义的变量可以在声明前访问，结果为undefined， var可以重复定义变量  不存在块级作用于
 * let 定义的变量只能在块级作用域使用  不可重复声明  定义前不可使用
 * const 定义的变量只能在块级作用域使用   不可重复声明  定义后不可更改（声明为object类型时可更改object属性） 定义前不可使用
 *
 */
//=============================================
var a = 10;
var obj = {
    a: 20,
    fn() {
        setTimeout(() => {
            console.log(this.a)
        })
    }
}
obj.fn()
/*
* this谁调用指向谁
* 此题中调用者为obj 因此this指向obj对象，打印结果为20
* */

//==============================
//symbol类型的用途
/***
 * symbol用于声明唯一变量，可避免命名冲突
 * */

//==================================
//说说什么是浅拷贝，什么是深拷贝
/***
 * 浅拷贝为变量内存地址的引用，
 * 深拷贝会开辟新的内存地址存放变量
 * */


//=====================
//简述Typescript与javascript之间的关系
/****
 * typescript 是JavaScript的超集
 * typescript扩展了JavaScript的语法 有利于大型应用的开发
 *
 * ***/
//=======================
//typescript缺点
/*********
 * 优点
 * 由于是js是的超集，js语法与ts语法相兼容
 * 代码可维护性变高
 *
 *
 * 缺点
 * 增加学习成本，typescript中引入了静态类型，接口等新语言特性，
 * ts需要编译 ，类型检查，执行编译过程时间较长
 *
 * */
//引用计数的工作原理和有缺陷
/***
 * 通过标记引用对象是否为0，判断是否为垃圾对象，从而进行回收操作
 * 优点：可及时回收垃圾对象
 * 减少程序卡顿时间
 * 缺点：无法回收循环引用的对象，
 * 对资源消耗比较大
 * */
//标记整理算法的工作流程
/******
 * 遍历所有对象找标记活动对象
 * 遍历所有对象清除没有标记对象
 * 回收相应的空间
 */
//v8中新生代存储垃圾回收流程
/* 回收过程采用复制算法+标记整理
 * 新生代内存区分为二个等大小空间
 * 使用空间为From 空闲空间为TO
 * 活动对象存储与From空间
 * 标记整理后将活动对象拷贝至TO
 * From与To 交换空间完成释放
*/
//增量标记算法在何时使用及工作原理
/**
 * 将一整段的垃圾回收过程分为多段
 * 垃圾回收与程序交替进行
 *
 *
 * 程序执行一段时间后，产生垃圾对象，开始遍历对象进行标记，第一次标记可能就标记第一层活动对象，第二次标记所有活动对象，最后对空间进行回收。
 */
